package peace.htmllooker.node
{
import flash.display.DisplayObject;
import flash.display.Loader;
import flash.events.ErrorEvent;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.MouseEvent;
import flash.events.ProgressEvent;
import flash.events.TextEvent;
import flash.net.URLRequest;
import flash.system.LoaderContext;
import flash.text.StyleSheet;

import peace.htmllooker.Htmllooker;
import peace.htmllooker.Node;

import peace.data.Dimensions;
import peace.gui.controls.tooltip.TextTooltip;
import peace.gui.controls.tooltip.Tooltips;
import peace.gui.layout.Align;
import peace.util.Logger;

public class Image extends Node
{
	protected var loader:Loader = new Loader();
	
	/**
	 * аттрибуты ссылки на картинке 
	 */	
	protected var href:String;
	/**
	 * альтернативный текст 
	 */	
	protected var alt:String;
	/**
	 * ширина для выравнивания 
	 */	
	protected var alignWidth:Number = 0;
	
	// не актуален, href уже содержит таргет
//	protected var target:String = "_self";
	
	public function Image(xml:XML, css:StyleSheet)
	{
		super(xml, css);
	}
	
	override protected function init(xml:XML, css:StyleSheet):void
	{
		
		// читаем свойства
		if (xml.@hspace != undefined) margin.left = margin.right = xml.@hspace; 
		if (xml.@vspace != undefined) margin.top = margin.bottom = xml.@vspace; 

		minWidth = 50 + shellWidth;
		minHeight = 50 + shellHeight;

		if (xml.@width != undefined) minWidth = explicitWidth = Number(xml.@width) + shellWidth; 
		if (xml.@height != undefined) minHeight = explicitHeight = Number(xml.@height) + shellHeight; 
		
		if (xml.@align != undefined) align = xml.@align; 

		if (xml.@alt != undefined) alt = xml.@alt; 

		// ссылка на картинке
		if (xml.@href != undefined)
		{
			href = xml.@href; 
			// отрезаем аттрибут события
			href = href.substr("event:".length);
			
			buttonMode = true;
			addEventListener(MouseEvent.CLICK, onClick, false,0,true);
			
			if (alt) // TEMPORARY: временное решение
			{
				var tooltip:String = alt || href.split(Htmllooker.LINK_TARGET_DELIMITER)[1];
				Tooltips.bind(this, new TextTooltip(tooltip));
			}
		}

		preferredWidth = explicitWidth ? explicitWidth : minWidth;
		preferredHeight = explicitHeight ? explicitHeight : minHeight;
		
		// грузим
		addChild(loader);
		loader.load(new URLRequest(xml.@src), new LoaderContext());
		
		loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete, false,0,true);
		loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError, false,0,true);
		
		// если удаляют со сцены, то это смена контента Htmllooker
		// и нужно отписываться от событий и прекращать загрузки
		addEventListener(Event.REMOVED_FROM_STAGE, onRemovedFromStage, false,0,true);
		
		super.init(xml, css);
	}
	/**
	 * 
	 * @return 
	 * 
	 */	
	override public function get content():DisplayObject
	{
		return loader;
	}
	/**
	 * 
	 * 
	 */	
	protected function doAlign ():void
	{
		if (alignWidth > minWidth && loader.width > 0)
		{
			// выравнивание
			if (align == Align.CENTER)
			{
				loader.x = (alignWidth - shellWidth - loader.width)/2;
			}
			else if (align == Align.RIGHT)
			{
				loader.x = alignWidth - loader.width - padding.right - margin.right;
			}
		}
	}
	
	override public function set width(value:Number):void
	{
		alignWidth = value;
		doAlign();
	}
	/**
	 * Для случаев когда картинку ещё не загрузили но размеры знаем
	 * @return 
	 */	
	override public function get width():Number
	{
		return minWidth;
	}
	override public function set height(value:Number):void
	{
	}
	/**
	 * Для случаев когда картинку ещё не загрузили но размеры знаем
	 * @return 
	 */	
	override public function get height():Number
	{
		return minHeight;
	}
	
	
	private function onComplete (e:Event):void
	{
		// если были явные размеры
		if (explicitWidth || explicitHeight)
		{
			if (explicitWidth && explicitHeight)
			{
				loader.width = explicitWidth;
				loader.height = explicitHeight;
			}
			// скейлим пропорционально
			else
			{
				var k:Number = loader.width/loader.height;
				loader.width = (explicitWidth) ? explicitWidth : explicitHeight * k;
				loader.height = (explicitHeight) ? explicitHeight : explicitWidth / k;
			}
		}
		
		var old:Dimensions = new Dimensions(minWidth, minHeight);
		
		minWidth = preferredWidth = loader.width + shellWidth;
		minHeight = preferredHeight = loader.height + shellHeight;
		
		doAlign();

		if (old.width != minWidth || old.height != minHeight)
		{
			arrange();
			parentBox.childSizeChanged(this);
		}
	}
	
	private function onError (e:ErrorEvent):void
	{	
		Logger.error(e.text)
	}
	
	private function onProgress (e:ProgressEvent):void
	{
	}
	
	private function onClick (e:MouseEvent):void
	{
		dispatchEvent(new TextEvent(TextEvent.LINK, true, false, href));
	}
	/**
	 * если удаляют со сцены, то это смена контента Htmllooker
	 * и нужно отписываться от событий и прекращать загрузки
	 * 
	 * @param e
	 * 
	 */	
	private function onRemovedFromStage (e:Event):void
	{
		try
		{
			loader.close();
		}
		catch(error:Error){}
	}
	
	
}
}